// DbUpdate.h
#pragma once

#include <string>
#include "../DbClient/DbClient.h" 
#include "../../generated/common_struct.pb.h"

class DbUpdate {
public:
    // 禁止实例化
    DbUpdate() = delete;

    /**
     * @brief 在 Neo4j 数据库中更新一个 (:User) 节点。
     * 
     * 此函数接收用户ID和一个包含需要更新字段的 UserNode 对象，
     * 构造并执行相应的 Cypher SET 语句来更新节点属性。
     * 
     * @param user_id 要更新的用户的ID。
     * @param user_updates 包含需要更新字段的 UserNode 对象。
     * @param error_message 如果更新失败，此字符串将包含描述错误的信息。
     * @return bool 如果节点更新成功则返回 true，否则返回 false。
     */
    static bool UpdateUser(int32_t user_id, const ::graph::UserNode& user_updates, std::string& error_message);

    /**
     * @brief 在 Neo4j 数据库中更新一个 (:List) 节点。
     * 
     * @param list_id 要更新的列表的ID。
     * @param list_updates 包含需要更新字段的 ListNode 对象。
     * @param error_message 如果更新失败，此字符串将包含描述错误的信息。
     * @return bool 如果节点更新成功则返回 true，否则返回 false。
     */
    static bool UpdateList(int32_t list_id, const ::graph::ListNode& list_updates, std::string& error_message);

    /**
     * @brief 在 Neo4j 数据库中更新一个 (:Todo) 节点。
     * 
     * @param todo_id 要更新的待办事项的ID。
     * @param todo_updates 包含需要更新字段的 TodoNode 对象。
     * @param error_message 如果更新失败，此字符串将包含描述错误的信息。
     * @return bool 如果节点更新成功则返回 true，否则返回 false。
     */
    static bool UpdateTodo(int32_t todo_id, const ::graph::TodoNode& todo_updates, std::string& error_message);

    /**
     * @brief 在 Neo4j 数据库中更新一个 (:Comment) 节点。
     * 
     * @param comment_id 要更新的评论的ID。
     * @param comment_updates 包含需要更新字段的 CommentNode 对象。
     * @param error_message 如果更新失败，此字符串将包含描述错误的信息。
     * @return bool 如果节点更新成功则返回 true，否则返回 false。
     */
    static bool UpdateComment(int32_t comment_id, const ::graph::CommentNode& comment_updates, std::string& error_message);

    /**
     * @brief 在 Neo4j 数据库中更新一个 (:Entity) 节点。
     * 
     * @param entity_id 要更新的实体的ID (字符串类型)。
     * @param entity_updates 包含需要更新字段的 EntityNode 对象。
     * @param error_message 如果更新失败，此字符串将包含描述错误的信息。
     * @return bool 如果节点更新成功则返回 true，否则返回 false。
     */
    static bool UpdateEntity(const std::string& entity_id, const ::graph::EntityNode& entity_updates, std::string& error_message);

private:
    // 辅助函数：将 repeated string 转换为分隔符分隔的字符串
    static std::string join_repeated_strings(const ::google::protobuf::RepeatedPtrField<std::string>& repeated_field, const std::string& delimiter = ";");
};
